home *** CD-ROM | disk | FTP | other *** search
/ Magnum One / Magnum One (Mid-American Digital) (Disc Manufacturing).iso / d12 / asm_msc1.arc / EX44.ASM < prev    next >
Assembly Source File  |  1988-11-20  |  2KB  |  48 lines

  1. TITLE  Division With Overflow (EX44.ASM)
  2.           PAGE      ,132
  3. OUR_CODE  SEGMENT   PARA 'CODE'
  4.       PUBLIC    DIVUO
  5. DIVUO     PROC      FAR
  6.           ASSUME    CS:OUR_CODE
  7.           CMP       BX,0             ;Divisor = 0?
  8.           JNZ       DVROK
  9.           INT       0
  10. DVROK:    PUSH      ES               ;Save current ES register
  11.       PUSH      DI             ; and DI register
  12.       MOV       DI,0         ;Fetch current INT 0 vector
  13.       MOV        ES,DI
  14.       PUSH      ES:[DI]         ; and save it on the stack
  15.       PUSH      ES:[DI+2]
  16.       MOV        CX,OFFSET OVR_INT  ;Make INT 0 vector
  17.       MOV       ES:[DI],CX         ; point to OVR_INT
  18.       MOV       CX,SEG OVR_INT
  19.       MOV       ES:[DI+2],CX
  20.       DIV       BX               ;Perform the division
  21.       SUB       BX,BX           ;If no overflow, BX = 0
  22. RESTORE:  POP       ES:[DI+2]          ;Restore INT 0 vector
  23.       POP       ES:[DI]
  24.       SUB       CX,CX           ;Final rem = CX:DX
  25.       POP       DI               ;Restore original DI
  26.       POP       ES               ; and ES
  27.       RET
  28. ;
  29. ;  This interrupt service routine is executed if the divide
  30. ;  operation produces overflow.
  31. ;
  32. OVR_INT:  POP       CX                 ;Modify ret. addr. offset
  33.       LEA        CX,RESTORE
  34.       PUSH      CX
  35.       PUSH        AX
  36.       MOV       AX,DX           ;Set up 1st dividend, 0-Y1
  37.       SUB        DX,DX
  38.       DIV       BX               ;Q1 is in AX, R1 is in DX
  39.       POP        CX               ;Pop orig. AX into CX
  40.       PUSH      AX               ;Save Q1 on stack
  41.       MOV        AX,CX           ;Set up 2nd dividend, R1-Y0
  42.       DIV       BX               ;Q0 is in AX, R0 is in DX
  43.       POP        BX               ;Final quotient is in BX:AX
  44.       IRET
  45. DIVUO     ENDP
  46. OUR_CODE  ENDS
  47.          END       DIVUO
  48.